/**
 * 
 */
package fr.gfi.agraf.persistence.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.core.GenericTypeResolver;
import org.springframework.stereotype.Repository;

import fr.gfi.agraf.persistence.dao.IAbstractGenericDAO;
import fr.gfi.agraf.persistence.entity.Utilisateur;

/**
 * @author eleve
 * 
 */
@Repository
public abstract class AbstractGenericDAO<T> implements IAbstractGenericDAO<T> {

	@PersistenceContext
	protected EntityManager em;

	/**
	 * Classe correspondant à l'entité
	 */
	private Class<T> clazz;

	/**
	 * 
	 */
	@SuppressWarnings("unchecked")
	public AbstractGenericDAO() {
		this.clazz = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), AbstractGenericDAO.class);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IAbstractGenericDAO#persist(java.lang.Object
	 * )
	 */
	public void persist(final T entity) {
		em.persist(entity);
		em.flush();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IAbstractGenericDAO#update(java.lang.Object)
	 */
	public void update(final T entity) {
		em.merge(entity);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IAbstractGenericDAO#delete(java.lang.Long)
	 */
	public void delete(final Long id) {
		em.remove(this.read(id));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.IAbstractGenericDAO#read(java.lang.Long)
	 */
	public T read(final Long id) {
		return em.find(clazz, id);
	}

	/**
	 * Recupere un utilisateur avec l'id
	 * 
	 * @param id
	 * @return
	 */
	public Utilisateur getUtilisateur(final int id) {
		final Utilisateur utilisateur = em.find(Utilisateur.class, id);
		return utilisateur;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.gfi.agraf.persistence.dao.IAbstractGenericDAO#listerTous()
	 */
	public List<T> listerTous() {
		return em.createQuery("SELECT d FROM " + clazz.getName() + " d", clazz).getResultList();
	}

}
